package GUI;

import edu.uci.ics.jung.visualization.VisualizationViewer;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * Panel z narysowanym grafem.
 * @author Piotrek
 */
public class GraphPanel extends JPanel {

    private static final int COLOR_COUNT = 255;
    private MyMatrix matrix;
    private VisualizationViewer vv;

    /**
     * Tworzy graf z macierzy
     * zwraca panel zawierający graf
     */
    private void setGraphPanel() {
        List nodes = createGraphVerticeData(matrix);
        List colorPalette = createRandomColorPalette(COLOR_COUNT);
        final GraphVisualizer graphVisualizer = new GraphVisualizer();
        vv = graphVisualizer.getGraphVisualizationViewer();
        JPanel graphVisualizationPanel = graphVisualizer.getGraphPanel(
                nodes, colorPalette);
        /*
        JPanel jp = new JPanel();
        jp.setBackground(Color.WHITE);
        jp.setLayout(new BorderLayout());
         */
        this.add(graphVisualizationPanel, BorderLayout.CENTER);
    }

    private static List createGraphVerticeData(MyMatrix matrix) {
        int verticeCount = matrix.columns();
        List vertexList = new ArrayList(verticeCount);
        Random random = new Random();
        for (int i = 0; i < verticeCount; ++i) {
            VertexInfo currentVertex = new VertexInfo();
            currentVertex.color = random.nextInt(COLOR_COUNT); ///
            currentVertex.label = "V" + i; ///           
            int[] edges = new int[verticeCount];
            for (int j = 0; j < i; j++) {
                edges[j] = matrix.get((byte) i, (byte) j);
            }
            for (int j = i; j < edges.length; j++) {
                edges[j] = 0;
            }
            currentVertex.edges = edges;
            vertexList.add(currentVertex);
        }
        return vertexList;
    }

    /**
     * Usuwa wartosci z lewego dolnego trojkata
     * wyświetlany jest tylko prawy górny trójkąt
     */
    private void clearLeftDownMatrix() {
        byte len = matrix.columns();
        for (byte i = 0; i < len; i++) {
            for (byte j = i; j < len; j++) {
                matrix.set(i, j, (byte) 0);
            }
        }
    }

    /**
     * Tworzy listę losowych kolorów, 
     * które są używane do kolorowania wierchołków
     * i krawędzi grafu.
     * @param colorCount ilość kolorów
     * @return lista kolorów
     */
    private static List createRandomColorPalette(int colorCount) {
        List palette = new ArrayList(colorCount);
        Random rand = new Random();
        for (int i = 0; i < colorCount; i++) {
            palette.add(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)));
        }
        return palette;
    }

    /**
     * Tworzy GraphPanel na którym wyświetlany jest graf z dodatkową funkcjonalością.
     * @param matrix macierz z której rysowany jest graf
     * @return panel z grafem
     */
    public static GraphPanel make(MyMatrix matrix) {
        GraphPanel graphPanel = new GraphPanel();
        graphPanel.matrix = matrix;
        graphPanel.setGraphPanel();

        return graphPanel;
    }

    /**
     * Tworzy GraphPanel na którym wyświetlany jest graf z dodatkową funkcjonalością.
     * @param specimenToPrint gatunek do wyświetlenia
     * @return panel z grafem
     */
    public static GraphPanel make(byte[][] specimenToPrint) {
        final GraphPanel graphPanel = new GraphPanel();
        graphPanel.matrix = new MyMatrix(specimenToPrint);
        graphPanel.clearLeftDownMatrix();
        graphPanel.setGraphPanel();
        return graphPanel;
    }
}
